package main

import (
	"fmt"
)

/*
两数之和
给定一个整数数组 nums和一个整数目标值 target，请你在该数组中找出 和为目标值 target 的那两个整数，并返回它们的数组下标。

你可以假设每种输入只会对应一个答案。但是，数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案。


*/

func main() {
	nums := []int{-3, 4, 3, 90}
	fmt.Println(twoSum(nums, 0))
}

/*
*
第一种
速度快，内存开销大，性价比更高
*/
func twoSum(nums []int, target int) []int {
	hashTable := make(map[int]int)
	for k, v := range nums {
		if val, ok := hashTable[target-v]; ok {
			return []int{k, val}
		}
		hashTable[v] = k
	}
	return nil
}

/*
第二种，速度慢，内存使用少
暴力枚举
*/
func twoSum1(nums []int, target int) []int {
	r := make([]int, 2)
	for i := 0; i < len(nums)-1; i++ {
		r[0] = i
		if search(nums, target, r, i+1) {
			return r
		}
	}
	return r
}
func search(nums []int, target int, r []int, pos int) bool {
	for i := pos; i < len(nums); i++ {
		r[1] = i
		if nums[r[0]]+nums[r[1]] == target {
			return true
		}
	}

	return false
}
